Skip to content

fix slow single-value array-contains filter on multi-valued properties#535

Merged
azahnen merged 2 commits into
masterfrom
fix-acontains-single-value-having
Jun 22, 2026
Merged

fix slow single-value array-contains filter on multi-valued properties#535
azahnen merged 2 commits into
masterfrom
fix-acontains-single-value-having

Conversation

@cportele

Copy link
Copy Markdown
Contributor

A_CONTAINS on a multi-valued property is encoded as

... IN (<values>) GROUP BY <id> HAVING count(distinct <col>) = <n>

For a single value n is 1 and the HAVING is tautological: every group selected by IN (<one value>) trivially has one distinct value, so the predicate is always true.

PostgreSQL has no selectivity estimate for a post-aggregate count(distinct) filter and falls back to a tiny default row count. That misestimate can drive a nested-loop plan that re-evaluates other predicates per row (for example a large id membership set), making the query extremely slow.

Drop the redundant HAVING for the single-value case (equivalent to the A_OVERLAPS encoding) so the planner sees an accurate grouped-row count. Multi-value filters keep the HAVING, which remains semantically required.

A_CONTAINS on a multi-valued property is encoded as
  ... IN (<values>) GROUP BY <id> HAVING count(distinct <col>) = <n>
For a single value n is 1 and the HAVING is tautological: every group
selected by IN (<one value>) trivially has one distinct value, so the
predicate is always true.

PostgreSQL has no selectivity estimate for a post-aggregate count(distinct)
filter and falls back to a tiny default row count. That misestimate can
drive a nested-loop plan that re-evaluates other predicates per row (for
example a large id membership set), making the query extremely slow.

Drop the redundant HAVING for the single-value case (equivalent to the
A_OVERLAPS encoding) so the planner sees an accurate grouped-row count.
Multi-value filters keep the HAVING, which remains semantically required.
@azahnen azahnen enabled auto-merge (squash) June 22, 2026 08:10
@azahnen azahnen merged commit 8a214cc into master Jun 22, 2026
3 checks passed
@azahnen azahnen deleted the fix-acontains-single-value-having branch June 22, 2026 08:14
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants